Ruby One-liner

今までのワンライナー

  • (仕方なく使っている)Windowsで気軽にテキスト処理したい
  • PowerShellはよくわからない
  • Gitをインストールした時についてくるGit Bash(+awk, sed, たまにperl)で頑張っていた

なぜRubyなのか

  • 1つの言語で済ませたいなと思って調べているとRubyでできるっぽい
  • Perlを必死に覚えればいいけど、今更感ある
  • Pythonのほうがよく使うけど、ワンライナーとlambdaが貧弱かつPython2と3の違いを意識したくなかった

Hello Ruby Oneliner

ruby -e 'puts "Hello Ruby Oneliner"'

複数行

# 省略形がどのように推移しているかまとめた
seq 1 3 | ruby -e 'while gets; puts $_; end'
seq 1 3 | ruby -ne 'puts $_'
seq 1 3 | ruby -ne 'print'
seq 1 3 | ruby -npe ''
1
2
3

出力の評価タイミング

# コマンド実行後に出力される
seq 1 3 | ruby -pne 'print "-"'
-1
-2
-3

型の確認

# pで確認すると末尾の改行が残っている
seq 1 3 | ruby -ne 'p $_'
"1\n"
"2\n"
"3\n"

末尾の改行をとる

# l オプションによって改行が除かれる
seq 1 3 | ruby -nle 'p $_'
"1"
"2"
"3"
# オプションをつけると特殊な変数の内容が変わるらしい
echo "" | ruby -ne 'p $/; p $\'
"\n"
nil

echo "" | ruby -nle 'p $/; p $\'
"\n"
"\n"

awkの代わり

echo "1 2 3" | ruby -ane 'p $F'
["1", "2", "3"]

echo "1,2,3" | ruby -ane 'p $F'
["1,2,3"]

echo "1,2,3" | ruby -F, -ane 'p $F'
["1", "2", "3\n"]

区切り文字

echo "" | ruby -ae 'p $;'
nil

# 区切り文字は正規表現扱い
echo "" | ruby -F.  -ae 'p $;'
echo "" | ruby -F\. -ae 'p $;'
/./

echo "" | ruby -F\\.  -ae 'p $;'
echo "" | ruby -F'\.' -ae 'p $;'
/\./

正規表現区切り

# テスト用
seq -w 0 .05 .1
0.00
0.05
0.10
seq -w 0 .05 .1 | ruby -F'\.' -anle 'p $F'
["0", "00"]
["0", "05"]
["0", "10"]

分割した値にアクセス

seq -w 0 .05 .1 | ruby -F'\.' -anle 'p $F[1]'
"00"
"05"
"10"

行へのアクセス

# sedの代わりなら、gsub
seq -w 0 .05 .1 | ruby -nle 'p $_.to_f'
0.0
0.05
0.1

他の機能

  • ファイル指定をしてワンライナー実行
  • awkのようにBEGIN, ENDを使ったsummaryの作成
  • sedのようにiオプションでバックアップファイルの作成

まとめ

  • Rubyだけでいろいろできる
  • Rubyで書いておくとShellだけで突っ走らずにスクリプトにするようにしそうな気がした